Αν η γιαγιά σας είχε καρούλια ***************************** Μέχρι τώρα έχουμε δει προγράμματα που εκτελούνται κάθε φορά με τον ίδιο τρόπο. Ας δούμε κάτι πιο πολύπλοκο. .. literalinclude:: ../ex/if.py :language: python Η εντολή ``if`` ελέγχει εάν κάτι είναι ``True`` ή ``False``. Εάν είναι ``True``, τότε το κομμάτι κώδικα που βρίσκεται αμέσως μετά, θα εκτελεστεί. Ειδάλλως, δε θα εκτελεστεί. Συχνά, δεν αρκεί να ορίσετε τι πρέπει να γίνει εάν μια συνθήκη ισχύει (δηλαδή εάν μια έκφραση είναι ``True``), αλλά και τι πρέπει να συμβεί εάν *δεν* ισχύει. Για το σκοπό αυτό υπάρχουν οι εντολές ``elif`` και ``else``. .. literalinclude:: ../ex/calc.py :language: python Η ``elif``, δίνει μια συνθήκη η οποία θα ελεγχθεί εάν η συνθήκη της ``if`` ήταν ``False``. Μπορείτε να έχετε όσες ``elif`` θέλετε στη σειρά, η κάθε μία θα ελεγχθεί μόνο εάν όλες οι προηγούμενες ήταν ψευδείς. Εάν η συνθήκη κάποιας ``elif`` είναι αληθής, τότε ο κώδικας που την ακολουθεί, εκτελείται, και το πρόγραμμα συνεχίζει **μετά από ολόκληρη τη δομή if...elif...else**. Η ``else`` εκτελείται εάν καμία συνθήκη δεν ήταν αληθής. **ΠΡΟΣΟΧΗ**: Το πολύ *ένα* από τα κομμάτια κώδικα που σχετίζονται με κάποια συνθήκη θα εκτελεστεί. Εμβόλιμο: code indentation ========================== Δείτε τα παρακάτω κομμάτια κώδικα και παρατηρήστε τις διαφορές μεταξύ τους: .. literalinclude:: ../ex/ind1.py :language: python .. literalinclude:: ../ex/ind2.py :language: python Η εσοχή στην αρχή μιας γραμμής χρησιμοποιείται για να ομαδοποιήσει κάποιες γραμμές κώδικα σε ένα **block**, δηλαδή ένα ενιαίο κομμάτι κώδικα. Το block τελειώνει όταν μια γραμμή ξεκινάει πιο πριν από την προηγούμενη. Η πλήρης σύνταξη ενός ``if`` είναι η εξής: .. code-block:: none if <συνθήκη>: block elif <συνθήκη>: block ... else: block Εάν η συνθήκη ενός ``if`` είναι ``True``, τότε θα εκτελεστεί **ολόκληρο το block που το ακολουθεί**, κι όχι μόνο μία γραμμή κώδικα. Στο παραπάνω παράδειγμα, η γραμμή ``print "Going home now."``, είναι έξω από το block του ``if`` στο πρώτο κομμάτι κώδικα, ενώ είναι μέσα στο δεύτερο. Αυτό σημαίνει πως στην πρώτη περίπτωση, ακόμα κι αν η μεταβλητή ``compiling`` ήταν ``True``, το ``print "Going home now."`` θα εκτελούταν, ενώ στη δεύτερη περίπτωση, θα εκτελεστεί μόνο εάν το ``compiling`` είναι ``True``. Αυτή η εσοχή συνήθως έχει μήκος 4 κενά, και θα τη συναντήσουμε και παρακάτω, όταν θα χρειαστεί να ομαδοποιήσουμε γραμμές κώδικα σε loops ή συναρτήσεις. Σύνθετες συνθήκες ================= Ήρθε η ώρα να χρησιμοποιήσουμε τη λογική που μάθαμε στο προηγούμενο κεφάλαιο. Έστω ότι φτιάχνετε ένα παιχνίδι, όπου παρουσιάζετε στον παίκτη το παρακάτω μενού: .. code-block:: none You enter a room, and the door closes behind you. The walls start closing in on you! What do you do? 1. Try to open the door. 2. Try to stop the left wall. 3. Try to stop the right wall. 4. Panic. > Ο χρήστης θα πατήσει έναν αριθμό από το 1 έως το 4 (ή και όχι), και το πρόγραμμα στη συνέχεια θα πρέπει να αποφασίσει τι θα κάνει. Θέλουμε, ό,τι και να πατήσει ο χρήστης να τον πληροφορήσουμε ότι πέθανε, γιατί το δωμάτιο είναι παγίδα και δεν υπάρχει τρόπος διαφυγής. Θα χρησιμοποιήσουμε τη ``raw_input()`` που είδαμε σε προηγούμενο κεφάλαιο: .. code-block:: python input = raw_input('> ') if input == '1' or input == '2' or input == '3' or input == '4': print "You die." else: print "Invalid choice! Shame, you could have been saved." **Άσκηση 4**: άλλη μια παγίδα ============================= Υποθέστε πως γράφετε ακόμα το παραπάνω παιχνίδι. Ο παίκτης έχει πέσει σε άλλη μία παγίδα, μόνο που αυτή τη φορά έχει μια ελπίδα διαφυγής. Γράψτε ένα μικρό πρόγραμμα python που κάνει τα παρακάτω. Αρχικά, παρουσιάστε το παρακάτω μενού και διαβάστε την είσοδο του χρήστη: .. code-block:: none You are at a corridor. Suddenly, the door behind you explodes, and the fire is coming toward you. On the far end of the corridor in front of you is another door with a lock. You: 1. Run to the door and try to open it. 2. Run to the door and try to break it down. 3. Panic. Εάν ο χρήστης επιλέξει 2 ή 3, τυπώστε ένα μήνυμα όπου θα περιγράφετε γλαφυρά τον αναπόφευκτο θάνατό του. Εάν όμως επιλέξει 1, τότε θεωρήστε ότι έχετε στη διάθεσή σας μια boolean μεταβλητή με όνομα ``have_key``, και εάν αυτή είναι True, τότε ο παίκτης μπορεί να ανοίξει την πόρτα και να διαφύγει. Τυπώστε του ένα μήνυμα που να τον πληροφορεί για τη σωτηρία του! Μην ξεχάσετε επίσης να προβλέψετε την περίπτωση όπου ο χρήστης δεν πατήσει μία από τις έγκυρες επιλογές.